android预览画面拉伸,Android Camera 预览图像被拉伸变形的解决方法 您所在的位置:网站首页 图片拉伸变形 手机 android预览画面拉伸,Android Camera 预览图像被拉伸变形的解决方法

android预览画面拉伸,Android Camera 预览图像被拉伸变形的解决方法

2024-07-16 23:41| 来源: 网络整理| 查看: 265

标签: Android 相机

最近做了一段时间的相机开发,有一些感悟,所以在这里整理分享出来。在这个过程中也出现了一些问题,比如预览的时候图像是被拉伸的,预览的时候旋转图片变形,把手机旋转90的时候预览图片是变形的等等,很多问题。其实最后的原因都是归因于分辨率。为什么会这么说,下面一点点分析。

自定义相机,从用户的操作的角度来看,有两个部分。一个是看手机屏幕的图像,一个是点击拍摄照片(有特殊功能的除外,说的都是一般的相机)。在这两部中,其实都是在跟图像打交道,手机屏幕上的图像其实就是一帧帧硬件相机扫描出来的结果,点击照相时就是把这一帧帧的图像挑选出来某一帧。

那说道图像,我想问个问题,“什么样的图像显示是正常的呢?“可能这个问题有些人不理解,也不知道怎么回答。我有一个答案,不知道说的对不对,但是我目前是这么认为的,如果要是有不同的意见,可以留言,大家一起讨论。我认为图像要是显示正常,应该是图像的大小跟分辨率匹配,图像的分辨率是表述像素点的多少的。那假设我有一个宽3,高4的图像,而在图像上的像素点却是,宽4个,高3个。那这种的话,像素点描述出来的图片肯定不是我们想要的,是被拍扁了的一张图片。所以自定义相机就应该是解决如何选择一个合适的分辨率设置给相机,而且应该是跟图像的宽高有关。

那下面就看看如果选择一个合适的分辨率。在android官方的demo例子里面是有相关的代码的。

private static Camera.Size getOptimalSize(@NonNull List sizes, int w, int h) {

final double ASPECT_TOLERANCE = 0.1;

double targetRatio = (double) h / w;

Camera.Size optimalSize = null;

double minDiff = Double.MAX_VALUE;

int targetHeight = h;

for (Camera.Size size : sizes) {

double ratio = (double) size.width / size.height;

if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;

if (Math.abs(size.height - targetHeight) < minDiff) {

optimalSize = size;

minDiff = Math.abs(size.height - targetHeight);

}

}

if (optimalSize == null) {

minDiff = Double.MAX_VALUE;

for (Camera.Size size : sizes) {

if (Math.abs(size.height - targetHeight) < minDiff) {

optimalSize = size;

minDiff = Math.abs(size.height - targetHeight);

}

}

}

return optimalSize;

}

其实很多人会觉得,都有现成的代码了,直接粘贴一些就好了,为啥上面说那么一堆。其实有这个方法在,好也好在这里,坏也坏在这里。需要注意的就是这么一行

double targetRatio = (double) h / w;

这里的代码是h/w,但是在官方的例子里面是w/h。因为在官方的demo里相机是横向的,但是我们一般使用的相机或者自定义的相机都是竖向的。至于设置横竖向,其实在AndroidMainfest.xml里面设置的

android:screenOrientation="portrait"/>

上面设置的是竖向,如果没有设置是横向。继续上面说的,为什么跟官方demo的不一样,其实就是因为官方的例子是横向的,所以得出来的w是大于h的,而我们的是竖向的,所以w是小于h。这样的话,就造成了筛选分辨率错误。(这里的w是指用SurfaceView的宽,h指的是SurfaceView的高,SurfaceView是用来预览的控件)

通过上面的getOptimalSize()方法就解决了挑选适合的分辨率,那图片也就显示正常了。只要设置分辨率的时机适当,相机就不会出现图片被拉伸的问题了。

有人会说那我能不能直接拿SurfaceView的宽高当作分辨率,我只能说有的手机是可行的,但不是所有的手机都支持自定义分比率,有的手机支持自带的几种分比率

Camera.Parameters cameraParameter = camera.getParameters();

cameraParameter.getSupportedPreviewSizes()

所以最好还是就在这几个分辨率里面挑



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有